home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Vollversion / CamD / development / examples / drum / asymbevel.a < prev    next >
Text File  |  2000-05-15  |  12KB  |  283 lines

  1. * ============================================================================ *
  2. *   ASymBevel: Draws an asymmetrical (thicker on one side).
  3. *
  4. *           AsymBevel(rp, ibox, ulpen, lrpen, fillpen, side);
  5. *                     a0  a1    d0     d1     d2       d3
  6. *
  7. * ============================================================================ *
  8. *
  9. * void _asm AsymBevel(  register __a0 struct RastPort *rp,
  10. *                       register __a1 struct IBox *b,
  11. *                       register __d0 LONG ulpen,
  12. *                       register __d1 LONG lrpen,
  13. *                       register __d2 LONG fillpen,
  14. *                       register __d3 WORD side );
  15. *
  16. * ============================================================================ *
  17. *
  18. *       Here's a rough picture of what the asymmetrical bevels look like.
  19. *       Essentially, the bevels seperating the two buttons are only a single
  20. *       pixel wide, whereas the bevels on either side of the buttons are two
  21. *       pixels wide.
  22. *
  23. *       My reason for doing this is that I think it looks nicer.
  24. *
  25. *   %%%%%%%%%%%%%%%%%%%%%%%%%%
  26. *   %%%%%%%%%%%%%%%%%%%%%%%%%%
  27. *   %%%%                 M%%%%
  28. *   %%%%  %%%%%%M %%%%%%MM%%%%
  29. *   %%%%  %%%MM%M %MM%%%MM%%%%
  30. *   %%%%  %%MM%%M %%MM%%MM%%%%
  31. *   %%%%  %MM%%%M %%%MM%MM%%%%
  32. *   %%%%  %%MM%%M %%MM%%MM%%%%
  33. *   %%%%  %%%MM%M %MM%%%MM%%%%
  34. *   %%%%  %%%%%%M %%%%%%MM%%%%
  35. *   %%%% MMMMMMMMMMMMMMMMM%%%%
  36. *   %%%%%%%%%%%%%%%%%%%%%%%%%%
  37. *   %%%%%%%%%%%%%%%%%%%%%%%%%%
  38. *
  39. * ============================================================================ *
  40.  
  41.             include     "exec/types.i"
  42.             include     "intuition/intuition.i"
  43. ;           include     "macros.i"
  44.  
  45.             SECTION asymbevel.asm,CODE
  46.  
  47. ;           far         code
  48. ;           far         data
  49.  
  50.             xdef        _AsymBevel
  51.  
  52.             xref        _LVOSetAPen,_LVORectFill,_GfxBase
  53.  
  54. qregs       reg         d2-d7/a2/a6
  55.  
  56. *           AsymBevel(rp, ibox, ulpen, lrpen, fillpen, side);
  57. *                     a0  a1    d0     d1     d2       d3
  58. *
  59.  
  60. LEFT        equr        d4
  61. TOP         equr        d5
  62. RIGHT       equr        d6
  63. BOTTOM      equr        d7
  64.  
  65. _AsymBevel:
  66.             movem.l     qregs,-(sp)
  67. ;           move.l      d1,d2                   ; d2 <-- lrpen
  68.             move.l      a0,a2                   ; save RastPort pointer
  69.             move.l      _GfxBase,a6             ; a6 register
  70.  
  71. ;---------- set up box
  72.  
  73.             moveq       #0,LEFT                 ; clear upper half of regs
  74.             moveq       #0,TOP
  75.             moveq       #0,RIGHT
  76.             moveq       #0,BOTTOM
  77.             movem.w     (a1),LEFT/TOP/RIGHT/BOTTOM
  78.                                                 ; d4 <-- ibox_Left
  79.                                                 ; d5 <-- ibox_Top
  80.                                                 ; d6 <-- ibox_Width
  81.                                                 ; d7 <-- ibox_Height
  82.             add.w       LEFT,RIGHT              ; d6 <-- right
  83.             add.w       TOP,BOTTOM              ; d7 <-- bottom
  84.             subq.w      #1,RIGHT                ; d6 <-- right - 1
  85.             subq.w      #1,BOTTOM               ; d7 <-- bottom - 1
  86.  
  87. ;---------- left side
  88.  
  89.             tst.w       d3
  90.             bne         50$                     ; do right side
  91.  
  92.             move.l      d2,-(sp)                ; save fillpen
  93.             move.l      d1,-(sp)                ; save lrpen
  94.  
  95. ;           move.l      d0,d0                   ; d0 already has ulpen
  96.             move.l      a2,a1                   ; a1 <-- rastport
  97.             jsr         _LVOSetAPen(a6)         ; set pen
  98.  
  99.             move.l      LEFT,d0                 ; d0 <-- left
  100.             move.l      TOP,d1                  ; d1 <-- top
  101.             move.l      RIGHT,d2                ; d2 <-- right
  102.             move.l      TOP,d3                  ; d3 <-- top
  103.             move.l      a2,a1                   ; a1 <-- rastport
  104.             jsr         _LVORectFill(a6)        ; rectangle fill
  105.  
  106.             move.l      LEFT,d0                 ; d0 <-- left
  107.             move.l      TOP,d1                  ; d1 <-- top
  108.             move.l      LEFT,d2
  109.             addq.l      #1,d2                   ; d2 <-- left + 1
  110.             move.l      BOTTOM,d3               ; d3 <-- bottom
  111.             move.l      a2,a1                   ; a1 <-- rastport
  112.             jsr         _LVORectFill(a6)        ; rectangle fill
  113.  
  114.             move.l      (sp)+,d0                ; d0 <-- lrpen
  115.             move.l      a2,a1                   ; a1 <-- rastport
  116.             jsr         _LVOSetAPen(a6)         ; set pen
  117.  
  118.             move.l      RIGHT,d0                ; d0 <-- right
  119.             move.l      TOP,d1
  120.             addq.l      #1,d1                   ; d2 <-- top + 1
  121.             move.l      RIGHT,d2                ; d2 <-- right
  122.             move.l      BOTTOM,d3               ; d3 <-- bottom
  123.             move.l      a2,a1                   ; a1 <-- rastport
  124.             jsr         _LVORectFill(a6)        ; rectangle fill
  125.  
  126.             move.l      LEFT,d0
  127.             addq.l      #1,d0                   ; d0 <-- left + 1
  128.             move.l      BOTTOM,d1               ; d1 <-- bottom
  129.             move.l      RIGHT,d2                ; d2 <-- right
  130.             move.l      BOTTOM,d3               ; d3 <-- bottom
  131.             move.l      a2,a1                   ; a1 <-- rastport
  132.             jsr         _LVORectFill(a6)        ; rectangle fill
  133.  
  134.             move.l      (sp)+,d0                ; fillpen
  135.             bmi         99$                     ; if no fillpen, then leave
  136.  
  137.             move.l      a2,a1                   ; a1 <-- rastport
  138.             jsr         _LVOSetAPen(a6)         ; set pen
  139.  
  140.             move.l      LEFT,d0
  141.             addq.l      #2,d0                   ; d0 <-- left + 2
  142.             move.l      TOP,d1
  143.             addq.l      #1,d1                   ; d1 <-- top + 1
  144.             move.l      RIGHT,d2
  145.             subq.l      #1,d2                   ; d1 <-- right - 1
  146.             move.l      BOTTOM,d3
  147.             subq.l      #1,d3                   ; d1 <-- bottom - 1
  148.  
  149.             cmp.w       d2,d0                   ; if left >= right
  150.             bge         99$                     ; then quit
  151.             cmp.w       d2,d0                   ; if top >= bottom
  152.             bge         99$                     ; then quit
  153.  
  154.             move.l      a2,a1                   ; a1 <-- rastport
  155.             jsr         _LVORectFill(a6)        ; rectangle fill
  156.  
  157.             bra         99$
  158.  
  159. 50$         move.l      d2,-(sp)                ; save fillpen
  160.             move.l      d0,-(sp)                ; save ulpen
  161.  
  162.             move.l      d1,d0                   ; d0 <-- lrpen
  163.             move.l      a2,a1                   ; a1 <-- rastport
  164.             jsr         _LVOSetAPen(a6)         ; set pen
  165.  
  166.             move.l      RIGHT,d0
  167.             subq.l      #1,d0                   ; d0 <-- right
  168.             move.l      TOP,d1                  ; d1 <-- top
  169.             move.l      RIGHT,d2                ; d2 <-- right
  170.             move.l      BOTTOM,d3               ; d3 <-- bottom
  171.             move.l      a2,a1                   ; a1 <-- rastport
  172.             jsr         _LVORectFill(a6)        ; rectangle fill
  173.  
  174.             move.l      LEFT,d0                 ; d0 <-- left
  175.             move.l      BOTTOM,d1               ; d1 <-- bottom
  176.             move.l      RIGHT,d2                ; d2 <-- right
  177.             move.l      BOTTOM,d3               ; d3 <-- bottom
  178.             move.l      a2,a1                   ; a1 <-- rastport
  179.             jsr         _LVORectFill(a6)        ; rectangle fill
  180.  
  181.             move.l      (sp)+,d0                ; d0 <-- lrpen
  182.             move.l      a2,a1                   ; a1 <-- rastport
  183.             jsr         _LVOSetAPen(a6)         ; set pen
  184.  
  185.             move.l      LEFT,d0                 ; d0 <-- left
  186.             move.l      TOP,d1                  ; d1 <-- top
  187.             move.l      RIGHT,d2
  188.             subq.l      #1,d2                   ; d2 <-- right + 1
  189.             move.l      TOP,d3                  ; d3 <-- top
  190.             move.l      a2,a1                   ; a1 <-- rastport
  191.             jsr         _LVORectFill(a6)        ; rectangle fill
  192.  
  193.             move.l      LEFT,d0                 ; d0 <-- left
  194.             move.l      TOP,d1                  ; d1 <-- top
  195.             move.l      LEFT,d2                 ; d2 <-- left
  196.             move.l      BOTTOM,d3
  197.             subq.l      #1,d3                   ; d2 <-- bottom - 1
  198.             move.l      a2,a1                   ; a1 <-- rastport
  199.             jsr         _LVORectFill(a6)        ; rectangle fill
  200.  
  201.             move.l      (sp)+,d0                ; fillpen
  202.             bmi         99$                     ; if no fillpen, then leave
  203.  
  204.             move.l      a2,a1                   ; a1 <-- rastport
  205.             jsr         _LVOSetAPen(a6)         ; set pen
  206.  
  207.             move.l      LEFT,d0
  208.             addq.l      #1,d0                   ; d0 <-- left + 1
  209.             move.l      TOP,d1
  210.             addq.l      #1,d1                   ; d1 <-- top + 1
  211.             move.l      RIGHT,d2
  212.             subq.l      #2,d2                   ; d1 <-- right - 2
  213.             move.l      BOTTOM,d3
  214.             subq.l      #1,d3                   ; d1 <-- bottom - 11
  215.  
  216.             cmp.w       d2,d0                   ; if left >= right
  217.             bge.s       99$                     ; then quit
  218.             cmp.w       d2,d0                   ; if top >= bottom
  219.             bge.s       99$                     ; then quit
  220.  
  221.             move.l      a2,a1                   ; a1 <-- rastport
  222.             jsr         _LVORectFill(a6)        ; rectangle fill
  223.  
  224. 99$         movem.l     (sp)+,qregs
  225.             rts
  226.  
  227.             end
  228.  
  229. /* original C code */
  230.  
  231. void AsymBevel(
  232.     struct RastPort     *rp,                    /* rast port to use             */
  233.     struct IBox         *b,                     /* extent of bevel              */
  234.     LONG                ulpen,                  /* upper-left pen               */
  235.     LONG                lrpen,                  /* lower-right pen              */
  236.     LONG                fillpen,                /* pen to fill with, or -1=none */
  237.     WORD                side )                  /* 0 = left side, 1 = right side*/
  238. {   UWORD               left = b->Left,
  239.                         right = left + b->Width - 1,
  240.                         top = b->Top,
  241.                         bottom = top + b->Height - 1;
  242.  
  243.         /* left side thicker */
  244.  
  245. #if 0
  246.         .........
  247.         ..      x
  248.         ..      x
  249.         .xxxxxxxx
  250.  
  251.         ........x
  252.         .      xx
  253.         .      xx
  254.         xxxxxxxxx
  255.  
  256. #endif
  257.  
  258.     if (side == 0)
  259.     {   SetAPen( rp, ulpen );
  260.         RectFill( rp, left, top, right, top );
  261.         RectFill( rp, left, top, left+1, bottom );
  262.         SetAPen( rp, lrpen );
  263.         RectFill( rp, right, top+1, right, bottom );
  264.         RectFill( rp, left+1, bottom, right, bottom );
  265.         if (fillpen >= 0 && left + 3 < right && top + 2 < bottom)
  266.         {   SetAPen( rp, fillpen );
  267.             RectFill( rp, left + 2, top + 1, right - 1, bottom - 1 );
  268.         }
  269.     }
  270.     else
  271.     {   SetAPen( rp, lrpen );
  272.         RectFill( rp, right - 1, top, right, bottom );
  273.         RectFill( rp, left, bottom, right, bottom );
  274.         SetAPen( rp, ulpen );
  275.         RectFill( rp, left, top, right - 1, top );
  276.         RectFill( rp, left, top, left, bottom - 1 );
  277.         if (fillpen >= 0 && left + 3 < right && top + 2 < bottom)
  278.         {   SetAPen( rp, fillpen );
  279.             RectFill( rp, left + 1, top + 1, right - 2, bottom - 2 );
  280.         }
  281.     }
  282. }
  283.